[RoarCTF 2019]Easy Calc 1

进来就是一个普通的计算器, 输入表达式给出结果,先看一波源代码

image-20211101192427994
image-20211101192502182

被设了WAF, 咱也不知道是防的啥, 接着看. 请求参数被发往calc.php, 我们直接访问一下看看:

image-20211101192659620

源码直接显示出来了, 可以看到有很多过滤, 很多字符都被列入了黑名单. 先看看能不能得到当前的文件绝对路径

image-20211101193809717

网页直接Forbidden了, 经过测试, 只要num的参数里含除数字以外的字符就会如此, 这应该就是之前说的WAF了, 不绕过这个WAF后面的操作都无法进行下去. 但是要绕过这个漏洞, 首先要知道php在解析提交的参数名和其对应的值时都做了什么

PHP需要将所有参数名转换为有效键名(比如在$_REQUEST变量里的关联数组里, 有所有提交的参数名和值)

所以php至少会干两件事

1.删除某些字符

2.将某些字符转换为下划线_

以下为一些本地测试结果:

  1. 位于提交的参数前面的[空格]%20+会被删除, 比如提交param=1& param2=2(或param=1&++param2=2) , 最终在$_REQUEST里是("param1"=>"1","param2"=>"2")
  2. 位于提交的参数前面的.会被替换成_ , 提交param=1&..param2=2, 最终在$_REQUEST里是("param1"=>"1","__param2"=>"2")
  3. 位于参数名中间、末尾,无论是[空格]+%20还是.都会被替换成_

这个WAF我们可以采用在num前面加个空格方式绕过, 构造payload:

1
2
calc.php? num=var_dump(scandir(chr(47))) 
//本题calc.php?%20num=var_dump(scandir(chr(47)))亦可

scandir()可以列出根目录下的文件, 但是/被过滤了, 所以用chr()函数,采用ASCII码的方式绕过

image-20211101202126567

根目录下有个f1agg, 想必就是我们要找的flag了.

故技重施, 用chr()函数拼出路径, 再用file_get_contents()(也可以用highlight_file())获取里面的内容, payload:

1
calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
image-20211101203110483